home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1993-10-25 | 3.8 KB | 94 lines | [.Ob./.Ob5] |
- Syntax10.Scn.Fnt
- Syntax10i.Scn.Fnt
- MODULE TickCounter; (* Michael Franz, 10.10.91 / 25.10.93 *)
- Installs a Task that will update a tick count which is displayed centered
- in a viewer. Oberon Tasks keep running when another application is
- brought in front of MacOberon, but are activated less often.
- The tick count may be exported to the caret position by the usual
- CopyOver control_option mouse key combination.
- Position the Star Marker in this viewer (Enter on Keypad)
- Compiler.Compile *
- TickCounter.Open
- IMPORT
- SYSTEM, Display, Fonts, Oberon, Texts, TextFrames, Viewers, MenuViewers, Input;
- CONST
- Font="Helvetica48.Scn.Fnt";
- TickMsg=RECORD (Display.FrameMsg) END;
- Frame=POINTER TO FrameDesc;
- FrameDesc=RECORD (Display.FrameDesc) END;
- W: Texts.Writer;
- ticks: LONGINT; countTask: Oberon.Task;
- fnt: Fonts.Font; x0, y0, w0, h0, dx0: INTEGER; pat0: Display.Pattern;
- PROCEDURE* Tick; (* Installed as an Oberon Task *)
- VAR t: LONGINT; M: TickMsg;
- BEGIN SYSTEM.GET(16AH, t);
- IF t#ticks THEN ticks:=t; Viewers.Broadcast(M) END
- END Tick;
- PROCEDURE UpdateCounter(F: Frame); (* Update Tick Count in Frame F *)
- VAR ch: CHAR; n: LONGINT; a: ARRAY 10 OF INTEGER; i, X, Y, dx, x, y, w, h: INTEGER; pat: Display.Pattern;
- BEGIN
- IF F.H > fnt.height THEN i:=0; n:=ticks;
- REPEAT a[i]:=SHORT(n MOD 10); n:=n DIV 10; INC(i) UNTIL n=0;
- X:=F.X+(F.W-i*dx0) DIV 2; Y:=F.Y+(F.H-fnt.height) DIV 2;
- REPEAT DEC(i); ch:=CHR(a[i]+ORD("0"));
- Display.GetChar(fnt.raster, ch, dx, x, y, w, h, pat);
- Display.CopyPattern(Display.white, pat, X+x, Y+y, Display.replace); INC(X, dx0)
- UNTIL i=0;
- END
- END UpdateCounter;
- PROCEDURE Export; (* Copy Counter to Caret *)
- VAR M: Oberon.CopyOverMsg;
- BEGIN Texts.WriteInt(W, ticks, 8); M.text:=TextFrames.Text(""); Texts.Append(M.text, W.buf);
- M.beg:=0; M.end:=M.text.len; Oberon.FocusViewer.handle(Oberon.FocusViewer, M)
- END Export;
- PROCEDURE Handle*(F: Display.Frame; VAR M: Display.FrameMsg);
- VAR keysum: SET; F1: Frame;
- BEGIN
- WITH F: Frame DO
- IF M IS TickMsg THEN UpdateCounter(F)
- ELSIF M IS Oberon.InputMsg THEN
- WITH M: Oberon.InputMsg DO
- IF M.id=Oberon.track THEN keysum:=M.keys; Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y);
- WHILE M.keys # {} DO Input.Mouse(M.keys, M.X, M.Y); keysum:=keysum+M.keys;
- Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y)
- END;
- IF keysum={0, 1} THEN Export END
- END
- END
- ELSIF M IS Oberon.ControlMsg THEN
- WITH M: Oberon.ControlMsg DO
- IF M.id=Oberon.mark THEN Oberon.DrawCursor(Oberon.Pointer, Oberon.Star, M.X, M.Y) END
- END
- ELSIF M IS Oberon.CopyMsg THEN
- WITH M: Oberon.CopyMsg DO NEW(F1); F1^:=F^; M.F:=F1 END
- ELSIF M IS MenuViewers.ModifyMsg THEN
- WITH M: MenuViewers.ModifyMsg DO F.H:=M.H; F.Y:=M.Y;
- IF M.H > 0 THEN Display.ReplConst(Display.black, F.X, F.Y, F.W, F.H, Display.replace); UpdateCounter(F) END
- END
- END
- END
- END Handle;
- PROCEDURE NewCountFrame(): Frame;
- VAR F: Frame;
- BEGIN NEW(F); F.handle:=Handle; RETURN F
- END NewCountFrame;
- PROCEDURE NewCountTask(VAR T: Oberon.Task);
- BEGIN NEW(T); T.safe:=FALSE; T.handle:=Tick; Oberon.Install(T)
- END NewCountTask;
- PROCEDURE Open*;
- VAR X, Y: INTEGER; V: Viewers.Viewer;
- BEGIN
- IF countTask=NIL THEN NewCountTask(countTask) END;
- Oberon.AllocateSystemViewer(Oberon.SystemTrack(0), X, Y);
- V:=MenuViewers.New(
- TextFrames.NewMenu("TickCounter", "System.Close System.Copy System.Grow TickCounter.Stop"),
- NewCountFrame(), TextFrames.menuH, X, Y)
- END Open;
- PROCEDURE Stop*;
- BEGIN Oberon.Remove(countTask); countTask:=NIL
- END Stop;
- BEGIN Texts.OpenWriter(W);
- fnt:=Fonts.This(Font); Display.GetChar(fnt.raster, "0", dx0, x0, y0, w0, h0, pat0);
- NewCountTask(countTask)
- END TickCounter.
-